package com.punai.common.utils;

import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.i18n.LocaleContextHolder;

import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 说明：DateUtil工具类
 * @Title: DateUtil.java 
 * @Package com.punai.core.util.lang 
 * @See: {@link DateUtils}
 * Copyright: Copyright (c) 2016 
 * Company:punai team by product
 * @author: fuyp  
 * @date: 2017年6月12日 下午2:18:53 
 * @version: V1.0
 */
public abstract class DateUtil extends DateUtils {
	/**
	 * 说明：定义后能再同一类中使用static常量log
	 */
	private static final Logger log = LoggerFactory.getLogger(DateUtil.class);
	/**
	 * 说明：定义后能再同一类中使用静态String常量TIME_PATTERN
	 */
	private static final String TIME_PATTERN = "HH:mm";
	/**
	 * 说明：声明String常量CODERULE_LONG_DATE
	 */
	public static final String CODERULE_LONG_DATE = "yyyyMMdd";
	/**
	 * 说明：声明String常量CODERULE_SHORT_DATE
	 */
	public static final String CODERULE_SHORT_DATE = "yyMMdd";
	/**
	 * 说明：声明String常量CODERULE_SHORT_SHORT_DATE
	 */
	public static final String CODERULE_SHORT_SHORT_DATE = "yyyy";
	/**
	 * 说明：声明String常量CODERULE_LONG_DATE_OTHER
	 */
	public static final String CODERULE_LONG_DATE_OTHER = "yyyy-MM-dd";
	/**
	 * 说明：声明String常量CODERULE_LONG_DATE_SIM
	 */
	public static final String CODERULE_LONG_DATE_SIM = "dd/MM/yyyy";
	/**
	 * 说明：声明String常量FULL_DATE
	 */
	public static final String FULL_DATE = "yyyy-MM-dd HH:mm:ss";
	/**
	 * 说明：定义后能再同一类中使用static常量df
	 */
	private static DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

	public static final String CHINA_DATE_YM = "yyyy年MM月";

	/**
	 * 说明：CheckStyle规则：实用类没有公共构造函数
	 */
	private DateUtil() {
	}


	public static String dateToyMd(Date dateDate) {
		if (dateDate == null) {
			return "";
		}
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		return formatter.format (dateDate);
	}

	public static String dateToyM(Date dateDate) {
		if (dateDate == null) {
			return "";
		}
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM");
		return formatter.format (dateDate);
	}


	/**
	 * 把字符串转换成 时间 需要的字符串格式为 yyyy年MM月
	 * @param timeStr
	 * @return
	 */
	public static Date dateToCHINAYM(String timeStr) {
		if (StringUtil.isBlank(timeStr)) {
			return new Date();
		}
		SimpleDateFormat formatter = new SimpleDateFormat(CHINA_DATE_YM);
		try {
			Date parse = formatter.parse(timeStr);
			return parse;
		}catch (ParseException e) {
			e.printStackTrace();
		}
		return new Date();
	}

	/**
	 * 说明：获取日期格式MM/dd/yyyy
	 * @Title: getDatePattern
	 * @See:
	 * @author tangheng
	 * @return 日期格式
	 * @date: 2015年4月27日 下午5:07:34
	 */
	public static String getDatePattern() {
		Locale locale = LocaleContextHolder.getLocale();
		String defaultDatePattern = null;
		try {
			defaultDatePattern = ResourceBundle.getBundle("messages", locale).getString(
					"date.format");
		} catch (MissingResourceException mse) {
			defaultDatePattern = FULL_DATE;
		}
		return defaultDatePattern;
	}

	/**
	 * 说明：获取日期和时间格式” MM/dd/yyyy HH:mm:ss“
	 * @Title: getDateTimePattern
	 * @See:
	 * @author tangheng
	 * @return 日期+时间
	 * @date: 2015年4月27日 下午7:20:14
	 */
	public static String getDateTimePattern() {
		return StringUtil.equals(DateUtil.getDatePattern(), FULL_DATE) ? FULL_DATE:DateUtil.getDatePattern()+ " HH:mm:ss";
	}

	/**
	 * 说明：转换一个Oracle格式的日期dd-MMM-yyyy-->mm/dd/yyyy这一方法
	 * @Title: getDate
	 * @See:
	 * @author tangheng
	 * @param stringDate 数据库中的日期作为字符串
	 * @param DateFormat  转换的日期格式
	 * @return 转换后的日期
	 * @date: 2015年4月27日 下午7:21:17
	 */
	public static Date getDate(String stringDate, String DateFormat) {
		SimpleDateFormat df;
		Date returnValue = null;

		if (stringDate != null) {
			df = new SimpleDateFormat(DateFormat);
			try {
				returnValue = df.parse(stringDate);
			} catch (ParseException e) {
				DateUtil.getNowDate();
			}
		}

		return returnValue;
	}

	/**
	 * 说明：转换一个Oracle格式的日期dd-MMM-yyyy-->mm/dd/yyyy这一方法的尝试
	 * @Title: getDate
	 * @See:
	 * @author tangheng
	 * @param aDate   对象日期
	 * @param DateFormat   转换日期格式
	 * @return 转换后的日期格式
	 * @date: 2015年4月27日 下午7:24:50
	 */
	public static String getDate(Date aDate, String DateFormat) {
		SimpleDateFormat df;
		String returnValue = "";

		if (aDate != null) {
			df = new SimpleDateFormat(DateFormat);
			returnValue = df.format(aDate);
		}
		return (returnValue);
	}

	/**
	 * 说明：获取指定格式的日期
	 * @Title: getDate
	 * @See:
	 * @author tangheng
	 * @param aDate    日期对象
	 * @return 获取日期
	 * @date: 2015年4月27日 下午7:29:06
	 */
	public static String getDate(Date aDate) {
		return getDate(aDate, getDatePattern());
	}

	/**
	 * 说明：获取当天最小时间例：Wed May 06 00:00:00 CST 2015
	 * @Title: getMinDate
	 * @See:
	 * @author tangheng
	 * @param aDate  指定日期
	 * @return 当天最小时间
	 * @date: 2015年4月27日 下午7:30:03
	 */
	public static Date getMinDate(Date aDate) {
		if (aDate == null || !(aDate instanceof Date)) {
			return null;
		}
		Calendar cal = Calendar.getInstance();
		cal.setTime(aDate);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		Date d2 = cal.getTime();
		return d2;
	}

	/**
	 * 说明：获取当天最大时间例如：Wed May 06 23:59:59 CST 2015
	 * @Title: getMaxDate
	 * @See:
	 * @author tangheng
	 * @param aDate  指定日期
	 * @return 当天最大时间
	 * @date: 2015年4月27日 下午7:31:15
	 */
	public static Date getMaxDate(Date aDate) {
		if (aDate == null || !(aDate instanceof Date)) {
			return null;
		}
		Calendar cal = Calendar.getInstance();
		cal.setTime(aDate);
		cal.set(Calendar.HOUR_OF_DAY, 23);
		cal.set(Calendar.MINUTE, 59);
		cal.set(Calendar.SECOND, 59);
		Date d2 = cal.getTime();
		return d2;
	}

	/**
	 * 说明：将日期字符串按指定格式转换成日期类型例如：
	 * "MM/dd/yyyy 05/06/2015"转换成Wed May 06 00:00:00 CST 2015
	 * @Title: convertStringToDate
	 * @See:
	 * @author tangheng
	 * @param aMask    MM/dd/yyyy
	 * @param strDate   待转换的日期字符串
	 * @return 指定格式转换成的日期类型
	 * @throws ParseException
	 * @date: 2015年4月27日 下午7:35:24
	 */
	public static Date convertStringToDate(String aMask, String strDate) throws ParseException {
		SimpleDateFormat df;
		Date date;
		df = new SimpleDateFormat(aMask);
		try {
			date = df.parse(strDate);
		} catch (ParseException pe) {
			throw new ParseException(pe.getMessage(), pe.getErrorOffset());
		}
		return (date);
	}
	
	/**
	 * 说明：将日期字符串按指定格式转换成日期类型例如：
	 * "MM/dd/yyyy 05/06/2015"转换成Wed May 06 00:00:00 CST 2015
	 * @Title: convertStringToDate
	 * @See:
	 * @author tangheng
	 * @param strDate   待转换的日期字符串
	 * @return 指定格式转换成的日期类型
	 * @throws ParseException
	 * @date: 2015年4月27日 下午7:35:24
	 */
	public static Date convertString2Date(String strDate) throws ParseException {
		if (StringUtil.isBlank(strDate)) {
			return null;
		}
		SimpleDateFormat df;
		Date date;
		if (StringUtil.length(strDate) > 7) {
			df = new SimpleDateFormat("yyyy-MM-dd");
		} else {
			df = new SimpleDateFormat("yyyy-MM");
		}
		try {
			date = df.parse(strDate);
		} catch (ParseException pe) {
			throw new ParseException(pe.getMessage(), pe.getErrorOffset());
		}
		return (date);
	}

	/**
	 * 说明：此方法返回当前的日期时间的格式：TIME_PATTERN(17:19)
	 * @Title: getTimeNow
	 * @See:
	 * @author tangheng
	 * @param theTime   当前的日期时间
	 * @return 当前的日期时间的格式：HH:mm
	 * @date: 2015年4月27日 下午7:37:33
	 */
	public static String getTimeNow(Date theTime) {
		return getDateTime(TIME_PATTERN, theTime);
	}

	/**
	 * 说明：获取当前时间的Calendar日历对象
	 * @Title: getToday
	 * @See:
	 * @author tangheng
	 * @param day  当前时间
	 * @return 当前时间的Calendar日历对象
	 * @throws ParseException
	 * @date: 2015年4月27日 下午7:40:32
	 */
	public static Calendar getToday(int day) throws ParseException {
		Date today = new Date();
		SimpleDateFormat df = new SimpleDateFormat(getDatePattern());
		String todayAsString = df.format(today);
		Calendar cal = new GregorianCalendar();
		cal.setTime(convertStringToDate(todayAsString));
		cal.add(Calendar.DATE, day);
		return cal;
	}

	/**
	 * 说明：根据制定day获得当前时间例如：
	 * Wed May 06 17:34:48 CST 2015------->Thu May 07 17:33:46 CST 2015
	 * @Title: getToday
	 * @See:
	 * @author tangheng
	 * @param date   指定日期
	 * @param day    指定时间
	 * @return 当前时间
	 * @date: 2015年4月27日 下午7:42:20
	 */
	public static Date getToday(Date date, int day) {
		Calendar cal = new GregorianCalendar();
		cal.setTime(date);
		cal.add(Calendar.DATE, day);
		return cal.getTime();
	}

	/**
	 * 说明：取得现在的时间
	 * @Title: getNowDate
	 * @See:
	 * @author tangheng
	 * @return 现在的时间
	 * @date: 2015年4月27日 下午7:43:38
	 */
	public static Date getNowDate() {
		return getDateByNow(0);
	}

	/**
	 * 说明：获取当天凌晨时间Wed May 06 00:00:00 CST 2015
	 * @Title: getDateByNow
	 * @See:
	 * @author tangheng
	 * @param day   指定天数
	 * @return 当前时间
	 * @date: 2015年4月27日 下午7:45:25
	 */
	public static Date getDateByNow(int day) {
		Date today = new Date();
		try {
			today = getToday(day).getTime();
		} catch (Exception e) {
		}
		return today;
	}

	/**
	 * 说明：指定日期的当前时间，并根据day给出相应日期时间
	 * @Title: getTodayByDay
	 * @See:
	 * @author tangheng
	 * @param nowDate      指定日期
	 * @param day      指定天数
	 * @return 指定天数对应的日期
	 * @date: 2015年4月27日 下午7:48:34
	 */
	public static Date getTodayByDay(Date nowDate, int day) {
		return getToday(nowDate, day);
	}

	/**
	 * 说明：返回当前日期（时间格式 如：05/07/2015 09:30:47 074)
	 * @Title: getNowDatetimeS
	 * @See:
	 * @author tangheng
	 * @return 当前日期（时间格式 yyyy/mm/dd hh:mm:ss SSS)
	 * @date: 2015年4月28日 上午9:30:27
	 */
	public static String getNowDatetimeS() {
		Date today = new Date();
		SimpleDateFormat df = new SimpleDateFormat(getDateTimePattern() + " SSS");
		String todayAsString = df.format(today);
		return todayAsString;
	}

	/**
	 * 说明：返回当前日期
	 * @Title: getNowDatetime
	 * @See:
	 * @author tangheng
	 * @return 当前日期如：Thu May 07 09:33:18 CST 2015
	 * @date: 2015年4月28日 上午9:31:03
	 */
	public static Date getNowDatetime() {
		Date today = new Date();
		SimpleDateFormat df = new SimpleDateFormat(getDateTimePattern());
		String todayAsString = df.format(today);
		try {
			return convertStringToDateTime(todayAsString);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return today;
	}
	
	/**
	 * 说明：返回format要求格式的时间
	 * @param date 
	 * @param format yyyy-MM-dd
	 * @return 当前日期如：2015--4-28 
	 */
	public static Date getFormatDate(Date date,String format) {
		if(date == null){
			date= new Date();
		} 
		SimpleDateFormat df = new SimpleDateFormat(format);
		String todayAsString = df.format(date);
		try {
			return convertStringToDate(format,todayAsString);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 说明：当前日期模板如：05/07/2015 09:46:35
	 * @Title: getFormartNowDatetime
	 * @See:
	 * @author tangheng
	 * @return 当前日期
	 * @date: 2015年4月28日 上午9:31:28
	 */
	public static Date getFormartNowDatetime() {
		Date today = new Date();
		SimpleDateFormat df = new SimpleDateFormat(getDateTimePattern());
		String todayAsString = df.format(today);
		try {
			return convertStringToDate(todayAsString);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return today;
	}
	

	/**
	 * 说明：获得服务器当前日期及时间，返回时间如：09:54
	 * @Title: getDateTime
	 * @See:
	 * @author tangheng
	 * @param aMask       日期模式串在
	 * @param aDate   日期对象
	 * @return
	 * @date: 2015年4月28日 上午9:34:15
	 */
	public static String getDateTime(String aMask, Date aDate) {
		SimpleDateFormat df = null;
		String returnValue = "";

		if (aDate == null) {
			log.warn("aDate is null!");
		} else {
			df = new SimpleDateFormat(aMask);
			returnValue = df.format(aDate);
		}
		return (returnValue);
	}

	/**
	 * 说明：将日期字符串按指定格式转换成日期类型 如：Thu May 07 10:10:16 CST 2015---->05/07/2015
	 * @Title: convertDateToString
	 * @See:
	 * @author tangheng
	 * @param aDate      日期对象
	 * @return 指定格式转换成日期类型
	 * @date: 2015年4月28日 上午9:35:36
	 */
	public static String convertDateToString(Date aDate) {
		return getDateTime(getDatePattern(), aDate);
	}

	/**
	 * 说明：将日期字符串按指定格式转换成日期类型如：05/07/2015 10:13:46
	 * @Title: convertDatetimeToString
	 * @See:
	 * @author tangheng
	 * @param aDate    日期对象
	 * @return 指定格式转换成日期类型
	 * @date: 2015年4月28日 上午9:37:22
	 */
	public static String convertDatetimeToString(Date aDate) {
		return getDateTime(getDateTimePattern(), aDate);
	}

	/**
	 * 说明：根据给定字符串日期转成日期类型的格式 时间清零如：12/09/2090--->Sat Dec 09 00:00:00 CST 2090
	 * @Title: convertStringToDate
	 * @See:
	 * @author tangheng
	 * @param strDate 给定字符串日期 (in format 12/09/2090)
	 * @returna date object
	 * @throws ParseException
	 * @date: 2015年4月28日 上午9:37:49
	 */
	public static Date convertStringToDate(final String strDate) throws ParseException {
		return convertStringToDate(getDatePattern(), strDate);
	}

	/**
	 * 说明：根据给定日期字符串按默认格式转换成日期类型例如： 
	 * 11/07/2099 09:46:35------>Sat Nov 07 09:46:35 CST 2099
	 * @Title: convertStringToDateTime
	 * @See:
	 * @author tangheng
	 * @param strDate  string日期
	 * @return 日期字符串按默认格式转换成日期类型
	 * @throws ParseException
	 * @date: 2015年4月28日 上午9:38:54
	 */
	public static Date convertStringToDateTime(final String strDate) throws ParseException {
		return convertStringToDate(DateUtil.getDateTimePattern(), strDate);
	}

	/**
	 * 说明：时间格式的枚举定义
	 * @ClassName: DateFormatForm
	 * @Package com.gtx.utac.util.lang
	 * @See:Copyright: Copyright (c) 2015 Company: puna
	 * @author tangheng
	 * @date 2015年4月28日 上午9:40:19
	 */
	public static enum DateFormatForm {
		FORMONE("yyyy-MM-dd"), FORMTWO("yyyy/MM/dd"), FORMTHREE("dd/MM/yyyy"), FORMFOUR(
				"yyyy-MM-dd HH:mm:ss");
		private String key;
		private DateFormatForm(String key) {
			this.key = key;
		}
		public String getKey() {
			return key;
		}
		public void setKey(String key) {
			this.key = key;
		}
		@Override
		public String toString() {
			return this.name() + ":" + this.key;
		}
	}

	/**
	 * 说明：比较日期
	 * @Title: compareToDate
	 * @See:
	 * @author tangheng
	 * @param orgDate  初始日期
	 * @param curDate  当前 日期
	 * @return -9是异常 大于 0 orgDate > curDate 小于0 orgDate < curDate 等于0 orgDate = curDate
	 * @date: 2015年4月28日 上午9:40:54
	 */
	public static int compareToDate(Date orgDate, Date curDate) {
		if (orgDate == null || curDate == null) {
			return -9;
		}
		return orgDate.compareTo(curDate);
	}

	/**
	 * 说明：获取当前日期+month后的日期
	 * @Title: getAddDate
	 * @See:
	 * @author tangheng
	 * @param month  月份
	 * @return 当前日期+month后的日期
	 * @date: 2015年4月28日 上午9:41:40
	 */
	public static Date getAddDate(int month,Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.MONTH, month);
		return calendar.getTime();
	}

	/**
	 * 说明：计算指定日期为当年第几周
	 * @Title: caculateWeekOfYear
	 * @See:
	 * @author tangheng
	 * @param year   指定的年份
	 * @param month  指定的月份
	 * @param day   指定的日
	 * @return 指定日期为当年的第几周
	 * @date: 2015年4月28日 上午9:42:02
	 */
	public static int caculateWeekOfYear(int year, int month, int day) {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.YEAR, year);
		c.set(Calendar.MONTH, month - 1);
		c.set(Calendar.DATE, day);
		return c.get(Calendar.WEEK_OF_YEAR);
	}

	/**
	 * 说明：计算指定日期为当年第几周
	 * @Title: caculateWeekOfYear
	 * @See:
	 * @author tangheng
	 * @param date     指定的日期
	 * @return 指定日期为当年的第几周
	 * @date: 2015年4月28日 上午9:42:37
	 */
	public static int caculateWeekOfYear(Date date) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c.get(Calendar.WEEK_OF_YEAR);
	}

	/**
	 * 说明：获取本月第一天的日期
	 * @Title: getDateOfFirstMonth
	 * @See:
	 * @author tangheng
	 * @param date  日期
	 * @return 本月第一天日期
	 * @date: 2015年4月28日 上午9:42:59
	 */
	public static Date getDateOfFirstMonth(Date date) {
		if (date == null) {
			date = getMinDate(getNowDate());
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		return calendar.getTime();
	}

	/**
	 * 说明：获取本月最后一天日期
	 * @Title: getDateOfLastMonth
	 * @See:
	 * @author tangheng
	 * @param date  日期对象
	 * @return 本月最后一天日期
	 * @date: 2015年4月28日 上午9:43:25
	 */
	public static Date getDateOfLastMonth(Date date) {
		if (date == null) {
			date = getMaxDate(getNowDate());
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
		return calendar.getTime();
	}

	/**
	 * 说明：获取本月第一天是星期几
	 * @Title: getWeekOfFirstDay
	 * @See:
	 * @author tangheng
	 * @param c   日历对象
	 * @return 本月第一天是星期几
	 * @date: 2015年4月28日 上午9:43:55
	 */
	public static int getWeekOfFirstDay(Calendar c) {
		Calendar calendar = c;
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		return calendar.get(Calendar.DAY_OF_WEEK);
	}

	/**
	 * 说明：获取本月1号是该年的第几周
	 * @Title: getMonthStartWeek
	 * @See:
	 * @author tangheng
	 * @param c  日历对象
	 * @return 本月1号是该年的第几周
	 * @date: 2015年4月28日 上午9:44:18
	 */
	public static int getMonthStartWeek(Calendar c) {
		Calendar calendar = c;
		calendar.set(Calendar.DATE, 1);
		return calendar.get(Calendar.WEEK_OF_YEAR);
	}

	/**
	 * 说明：获取当天是该年的第几周
	 * @Title: getCurrentWeekOfYear
	 * @See:
	 * @author tangheng
	 * @return 当天是该年的第几周
	 * @date: 2015年4月28日 上午9:44:45
	 */
	public static int getCurrentWeekOfYear() {
		Calendar calendar = Calendar.getInstance();
		return calendar.get(Calendar.WEEK_OF_YEAR);
	}

	/**
	 * 说明：获取上月的总天数
	 * @Title: getLastMonthDays
	 * @See:
	 * @author tangheng
	 * @param c 日历对象
	 * @return 上月的总天数
	 * @date: 2015年4月28日 上午9:45:02
	 */
	public static int getLastMonthDays(Calendar c) {
		Calendar calendar = c;
		calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);
		return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
	}

	/**
	 * 说明：获取指定月份的总天数
	 * @Title: getCurrentMonthDays
	 * @See:
	 * @author tangheng
	 * @param month  月份
	 * @return 指定月份的总天数
	 * @date: 2015年4月28日 上午9:45:28
	 */
	public static int getCurrentMonthDays(int month) {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.MONTH, month);
		// System.out.println(DateUtil.getCurrentMonthDays(0));
		return c.getActualMaximum(Calendar.DAY_OF_MONTH);
	}

	/**
	 * 说明：获取指定年份有多少周
	 * @Title: getTotalWeekOfYear
	 * @See:
	 * @author tangheng
	 * @param year  年份
	 * @return 指定年份有多少周
	 * @date: 2015年4月28日 上午9:46:02
	 */
	public static int getTotalWeekOfYear(int year) {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.YEAR, year);
		return c.getActualMaximum(Calendar.WEEK_OF_YEAR);
	}

	/**
	 * 说明：获取指定日期的月份有多少周
	 * @Title: getTotalWeekOfMonth
	 * @See:
	 * @author tangheng
	 * @param date 日期对象
	 * @return 指定日期的月份有多少周
	 * @date: 2015年4月28日 上午9:46:25
	 */
	public static int getTotalWeekOfMonth(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		return cal.getActualMaximum(Calendar.WEEK_OF_MONTH);
	}

	/**
	 * 说明：判断指定月份是否是当前月
	 * @Title: isCurrentMonth
	 * @See:
	 * @author tangheng
	 * @param month  月份
	 * @return 指定月份是否是当前月
	 * @date: 2015年4月28日 上午9:46:47
	 */
	public static boolean isCurrentMonth(int month) {
		Calendar c = Calendar.getInstance();
		return (c.get(Calendar.MONTH) == month) ? true : false;
	}

	/**
	 * 说明：计算指定的月份共有多少天 当前月份减-1
	 * @Title: getTotalDaysOfMonth
	 * @See:
	 * @author tangheng
	 * @param year 年份
	 * @param month  月份
	 * @return 指定的月份共有多少天 当前月份减-1
	 * @date: 2015年4月28日 上午9:47:10
	 */
	public static int getTotalDaysOfMonth(int year, int month) {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.YEAR, year);
		c.set(Calendar.MONTH, month);
		c.set(Calendar.DATE, 1);
		return c.getActualMaximum(Calendar.DAY_OF_MONTH);
	}

	/**
	 * 说明：计算指定日期是星期几 当前月份减-1
	 * @Title: getDayOfWeek
	 * @See:
	 * @author tangheng
	 * @param year  年份
	 * @param month   月份
	 * @param day  日期
	 * @return 指定日期是星期几 当前月份减-1
	 * @date: 2015年4月28日 上午9:47:44
	 */
	public static int getDayOfWeek(int year, int month, int day) {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.YEAR, year);
		c.set(Calendar.MONTH, month);
		c.set(Calendar.DATE, day);
		return c.get(Calendar.DAY_OF_WEEK) - 1;
	}

	/**
	 * 说明：计算指定日期是星期几
	 * @Title: getDayOfWeek
	 * @See:
	 * @author tangheng
	 * @param date   日期对象
	 * @return 指定日期是星期几
	 * @date: 2015年4月28日 上午9:48:12
	 */
	public static int getDayOfWeek(Date date) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c.get(Calendar.DAY_OF_WEEK) - 1;
	}

	/**
	 * 说明：计算指定日期月份公有多少天
	 * @Title: getTotalDaysOfMonth
	 * @See:
	 * @author tangheng
	 * @param date 对象日期
	 * @return 指定日期月份公有多少天
	 * @date: 2015年4月28日 上午9:48:35
	 */
	public static int getTotalDaysOfMonth(Date date) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c.getActualMaximum(Calendar.DAY_OF_MONTH);
	}

	/**
	 * 说明：计算指定日期是当月第几天
	 * @Title: getDayOfMonth
	 * @See:
	 * @author tangheng
	 * @param date  对象日期
	 * @return 指定日期是当月第几天
	 * @date: 2015年4月28日 上午9:49:05
	 */
	public static int getDayOfMonth(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		return cal.get(Calendar.DATE);
	}

	/**
	 * 说明：获取当前星期
	 * @Title: getDate
	 * @See:
	 * @author tangheng
	 * @param year  年份
	 * @param month    月份
	 * @param day    日期
	 * @return
	 * @date: 2015年4月28日 上午9:49:34
	 */
	public static Date getDate(int year, int month, int day) {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.YEAR, year);
		c.set(Calendar.MONTH, month);
		c.set(Calendar.DATE, day);
		return c.getTime();
	}

	/**
	 * 说明：获取指定日期的最小时间如： getMinDate(2015,5,7)得到Sun Jun 07 00:00:00 CST 2015
	 * @Title: getMinDate
	 * @See:
	 * @author tangheng
	 * @param year    年份
	 * @param month     月份
	 * @param day    日期
	 * @return 指定日期 当前月份减-1
	 * @date: 2015年4月28日 上午9:50:05
	 */
	public static Date getMinDate(int year, int month, int day) {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.YEAR, year);
		c.set(Calendar.MONTH, month);
		c.set(Calendar.DATE, day);
		c.set(Calendar.HOUR_OF_DAY, 0);
		c.set(Calendar.MINUTE, 0);
		c.set(Calendar.SECOND, 0);
		return c.getTime();
	}

	/**
	 * 说明：获取指定日期最大时间如： getMaxDate(2015,5,7)得到Sun Jun 07 23:59:59 CST 2015
	 * @Title: getMaxDate
	 * @See:
	 * @author tangheng
	 * @param year     年份
	 * @param month      月份
	 * @param day     日期
	 * @return 指定日期 当前月份减-1
	 * @date: 2015年4月28日 上午9:50:45
	 */
	public static Date getMaxDate(int year, int month, int day) {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.YEAR, year);
		c.set(Calendar.MONTH, month);
		c.set(Calendar.DATE, day);
		c.set(Calendar.HOUR_OF_DAY, 23);
		c.set(Calendar.MINUTE, 59);
		c.set(Calendar.SECOND, 59);
		return c.getTime();
	}

	/**
	 * 说明：根据指定字符串年月的第一天最小时间
	 * @See:
	 * @author tangheng
	 * @param year    年份
	 * @param month    月份
	 * @return 指定年月的最小时间
	 * @date: 2015年4月28日 上午9:51:18
	 */
	public static Date getMinDate(String year, String month) {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.YEAR, NumberUtil.obj2Integer(year));
		c.set(Calendar.MONTH, NumberUtil.obj2Integer(month) - 1);
		c.set(Calendar.DATE, 1);
		c.set(Calendar.HOUR_OF_DAY, 0);
		c.set(Calendar.MINUTE, 0);
		c.set(Calendar.SECOND, 0);
		return c.getTime();
	}

	/**
	 * 说明：获取指定日期
	 * @Title: getMaxDate
	 * @See:
	 * @author tangheng
	 * @param year      年份
	 * @param month    月份
	 * @return 指定日期
	 * @date: 2015年4月28日 上午9:52:12
	 */
	public static Date getMaxDate(String year, String month) {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.YEAR, NumberUtil.obj2Integer(year));
		c.set(Calendar.MONTH, NumberUtil.obj2Integer(month) - 1);
		c.set(Calendar.DATE, c.getActualMaximum(Calendar.DAY_OF_MONTH));
		c.set(Calendar.HOUR_OF_DAY, 23);
		c.set(Calendar.MINUTE, 59);
		c.set(Calendar.SECOND, 59);
		return c.getTime();
	}

	/**
	 * 说明：计算两个日期间的天数
	 * @Title: dateDiff
	 * @See:
	 * @author tangheng
	 * @param fromDate    起始日期
	 * @param toDate    结束日期
	 * @return 两个日期间的天数
	 * @date: 2015年4月28日 上午9:53:03
	 */
	public static int dateDiff(Date fromDate, Date toDate) {
		if (toDate == null || fromDate == null) {
			return -1;
		}
		if (toDate.before(fromDate)) {
			return -1;
		}
		int days = 0;
		days = (int) Math.abs((toDate.getTime() - fromDate.getTime()) / (24 * 60 * 60 * 1000)) + 1;
		return days;
	}

	/**
	 * 说明：根据date字符串日期转换成中文格式日期 例：05/07/2015------>二〇一五年五月七日
	 * @Title: dateToCnDate
	 * @See:
	 * @author tangheng
	 * @param date  对象日期
	 * @return 字符串日期转换成中文格式日期
	 * @date: 2015年4月28日 上午9:53:35
	 */
	public static String dateToCnDate(Date date) {
		return dateToCnDate(getDate(date, CODERULE_LONG_DATE_OTHER));
	}

	/**
	 * 说明：指定格式字符串日期转换成中文格式日期 例:2015-05-07---->二〇一五年五月七日
	 * @Title: dateToCnDate
	 * @See:
	 * @author tangheng
	 * @param date  字符串日期 yyyy-MM-dd
	 * @return yyyy年MM月dd日
	 * @date: 2015年4月28日 上午9:53:56
	 */
	public static String dateToCnDate(String date) {
		String result = "";
		String[] cnDate = new String[] { "〇", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
		String ten = "十";
		String[] dateStr = date.split("-");
		for (int i = 0; i < dateStr.length; i++) {
			for (int j = 0; j < dateStr[i].length(); j++) {
				String charStr = dateStr[i];
				String str = String.valueOf(charStr.charAt(j));
				if (charStr.length() == 2) {
					if (charStr.equals("10")) {
						result += ten;
						break;
					} else {
						if (j == 0) {
							if (charStr.charAt(j) == '1')
								result += ten;
							else if (charStr.charAt(j) == '0')
								result += "";
							else
								result += cnDate[Integer.parseInt(str)] + ten;
						}
						if (j == 1) {
							if (charStr.charAt(j) == '0')
								result += "";
							else
								result += cnDate[Integer.parseInt(str)];
						}
					}
				} else {
					result += cnDate[Integer.parseInt(str)];
				}
			}
			if (i == 0) {
				result += "年";
				continue;
			}
			if (i == 1) {
				result += "月";
				continue;
			}
			if (i == 2) {
				result += "日";
				continue;
			}
		}
		return result;
	}

	/**
	 * 说明：根据给出的字符串日期转换成中文格式并获取年份如;2015-05-07----->二〇一五
	 * @Title: dateToCnDateSubYear
	 * @See:
	 * @author tangheng
	 * @param date      字符串日期 yyyy-MM-dd
	 * @return 中文格式年份
	 * @date: 2015年4月28日 上午9:54:22
	 */
	public static String dateToCnDateSubYear(String date) {
		String result = "";
		String[] cnDate = new String[] { "〇", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
		String ten = "十";
		String[] dateStr = date.split("-");
		for (int i = 0; i < dateStr.length; i++) {
			for (int j = 0; j < dateStr[i].length(); j++) {
				String charStr = dateStr[i];
				String str = String.valueOf(charStr.charAt(j));
				if (charStr.length() == 2) {
					if (charStr.equals("10")) {
						result += ten;
						break;
					} else {
						if (j == 0) {
							if (charStr.charAt(j) == '1')
								result += ten;
							else if (charStr.charAt(j) == '0')
								result += "";
							else
								result += cnDate[Integer.parseInt(str)] + ten;
						}
						if (j == 1) {
							if (charStr.charAt(j) == '0')
								result += "";
							else
								result += cnDate[Integer.parseInt(str)];
						}
					}
				} else {
					result += cnDate[Integer.parseInt(str)];
				}
			}
		}
		result = result.substring(0, 4);
		return result;
	}

	/**
	 * 说明：获取年份
	 * @Title: getYearByNow
	 * @See:
	 * @author tangheng
	 * @return 当前年份
	 * @date: 2015年4月28日 上午9:54:55
	 */
	public static int getYearByNow() {
		try {
			return DateUtil.getToday(0).get(Calendar.YEAR);
		} catch (ParseException e) {
			e.printStackTrace();
			return 0;
		}
	}
	/**
	 * 说明：获取当前月份
	 * @Title: getMonthByNow
	 * @See:
	 * @author tangheng
	 * @return 当前月份
	 * @date: 2015年4月28日 上午9:55:19
	 */
	public static int getMonthByNow() {
		try {
			return DateUtil.getToday(0).get(Calendar.MONTH) + 1;
		} catch (ParseException e) {
			e.printStackTrace();
			return 0;
		}
	}

	/**
	 * 说明：webService使用日期对象 例：2015-05-07T14:40:09.344+08:00
	 * @Title: convertToXMLGregorianCalendar
	 * @See:
	 * @author tangheng
	 * @param date    对象日期
	 * @return webService使用日期对象
	 * @date: 2015年4月28日 上午9:55:40
	 */
	public static XMLGregorianCalendar convertToXMLGregorianCalendar(Date date) {
		GregorianCalendar cal = new GregorianCalendar();
		cal.setTime(date);
		XMLGregorianCalendar gc = null;
		try {
			gc = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return gc;
	}
	/**
	 * 说明：根据传入的字符串返回时间
	 * @Title: convertToXMLGregorianCalendar
	 * @See:
	 * @author CWJ
	 * @param dateStr 时间对象字符串
	 * @return date 时间对象
	 * @date: 2021年6月30日15:50:22
	 */
	public static Date getDate(String dateStr){
		SimpleDateFormat simpleDateFormat = null;
		if(StringUtil.isNullOrEmpty(dateStr)){
			return null;
		}
		try {
			if(StringUtil.isNumeric(dateStr)){
				return new Date(Long.parseLong(dateStr));
			}
			if(dateStr.contains("-")){
				if(dateStr.contains(":")){
					simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
					return simpleDateFormat.parse(dateStr);
				}
				if (dateStr.length() > 7) {
					simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
				} else {
					simpleDateFormat=new SimpleDateFormat("yyyy-MM");
				}
				return simpleDateFormat.parse(dateStr);
			}
			if(dateStr.contains("/")){
				if(dateStr.contains(":")){
					simpleDateFormat=new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
					return simpleDateFormat.parse(dateStr);
				}
				simpleDateFormat=new SimpleDateFormat("yyyy/MM/dd");
				return simpleDateFormat.parse(dateStr);
			}
			return null;
		}catch(Exception e){
			return null;
		}
	}
	/**
	 * 说明：获取两个时间之间的所有月份
	 * @Title: getMonthBetween
	 * @See:
	 * @author CWJ
	 * @param minDate:最小时间字符串  maxDate:最大时间字符串  (格式为yyyy-MM)
	 * @return List<String>月份集合
	 * @date: 2021年9月30日17:36:35
	 */
    public static List<String> getMonthBetween(String minDate, String maxDate) throws ParseException {
        List<String> result = new ArrayList<String>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
 
        Calendar min = Calendar.getInstance();
        Calendar max = Calendar.getInstance();
 
        min.setTime(sdf.parse(minDate));
        min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);
 
        max.setTime(sdf.parse(maxDate));
        max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);
 
        Calendar curr = min;
        while (curr.before(max)) {
            result.add(sdf.format(curr.getTime()));
            curr.add(Calendar.MONTH, 1);
        }
 
        return result;
    }
	/**
	 * 说明：根据时间date获取季度
	 * @Title: getQuarter
	 * @See: 
	 * @author CWJ
	 * @param 
	 * @return 季度
	 * @date: 2021年10月18日15:25:00
	 */
    public static String getQuarter(Date date) throws ParseException {
    	String month = new SimpleDateFormat("MM").format(date);
    	int monthInt = Integer.parseInt(month);
    	if(monthInt>=10) return "四";
    	if(monthInt>=7) return "三";
    	if(monthInt>=4) return "二";
        return "一";
    }
	/**
	 * 说明：根据时间date获取年份
	 * @Title: getYear
	 * @See: 
	 * @author CWJ
	 * @param 
	 * @return 年份
	 * @date: 2021年10月18日15:25:00
	 */
    public static String getYear(Date date){
    	String Year = new SimpleDateFormat("yyyy").format(date);
        return Year;
    }
	/**
	 * 说明：根据时间date获取月份
	 * @Title: getMonth
	 * @See: 
	 * @author CWJ
	 * @param 
	 * @return 月份
	 * @date: 2021年10月18日15:25:00
	 */
    public static String getMonth(Date date){
    	String month = new SimpleDateFormat("MM").format(date);
        return month;
    }
	public static void main(String[] args) {
		try {
			System.out.println(convertStringToDateTime("2021-02-5"));
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 说明：根据传入的字符串返回传入的格式
	 * @Title: convertToXMLGregorianCalendar
	 * @See:
	 * @author CWJ
	 * @param dateStr 时间对象字符串
	 * @return date 时间对象
	 * @date: 2021年6月30日15:50:22
	 */
	public static String getDateToFormat(String dateStr,String format){
		SimpleDateFormat simpleDateFormat = null;
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		if(StringUtil.isNullOrEmpty(dateStr)){
			return null;
		}
		try {
			if(dateStr.contains("-")){
				if(dateStr.contains(":")){
					simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
					return sdf.format(simpleDateFormat.parse(dateStr));
				}
				simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
				return sdf.format(simpleDateFormat.parse(dateStr));
			}
			if(dateStr.contains("/")){
				if(dateStr.contains(":")){
					simpleDateFormat=new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
					return sdf.format(simpleDateFormat.parse(dateStr));
				}
				simpleDateFormat=new SimpleDateFormat("yyyy/MM/dd");
				return sdf.format(simpleDateFormat.parse(dateStr));
			}
			return null;
		}catch(Exception e){
			return null;
		}
	}
}
